package com.example.studentknowledge.service;

import com.example.studentknowledge.entity.Category;
import com.example.studentknowledge.repository.CategoryRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Optional;

/**
 * 分类服务类
 */
@Service
@Transactional
public class CategoryService {
    
    @Autowired
    private CategoryRepository categoryRepository;
    
    /**
     * 创建分类
     */
    public Category createCategory(Category category) {
        // 检查分类名称是否已存在
        if (categoryRepository.existsByName(category.getName())) {
            throw new RuntimeException("分类名称已存在");
        }
        
        return categoryRepository.save(category);
    }
    
    /**
     * 更新分类
     */
    public Category updateCategory(Category category) {
        Category existingCategory = categoryRepository.findById(category.getId())
                .orElseThrow(() -> new RuntimeException("分类不存在"));
        
        // 检查分类名称是否已被其他分类使用
        Optional<Category> categoryWithSameName = categoryRepository.findByName(category.getName());
        if (categoryWithSameName.isPresent() && !categoryWithSameName.get().getId().equals(category.getId())) {
            throw new RuntimeException("分类名称已存在");
        }
        
        return categoryRepository.save(category);
    }
    
    /**
     * 根据ID查找分类
     */
    public Optional<Category> findById(Long id) {
        return categoryRepository.findById(id);
    }
    
    /**
     * 根据名称查找分类
     */
    public Optional<Category> findByName(String name) {
        return categoryRepository.findByName(name);
    }
    
    /**
     * 获取所有分类
     */
    public List<Category> findAll() {
        return categoryRepository.findAll();
    }
    
    /**
     * 获取所有启用的分类
     */
    public List<Category> findAllEnabled() {
        return categoryRepository.findAllEnabledOrderBySortOrder();
    }
    
    /**
     * 根据启用状态获取分类
     */
    public List<Category> findByEnabled(Boolean enabled) {
        return categoryRepository.findByEnabledOrderBySortOrder(enabled);
    }
    
    /**
     * 搜索分类
     */
    public List<Category> searchCategories(String keyword) {
        return categoryRepository.findByNameContainingIgnoreCase(keyword);
    }
    
    /**
     * 删除分类
     */
    public void deleteCategory(Long id) {
        Category category = categoryRepository.findById(id)
                .orElseThrow(() -> new RuntimeException("分类不存在"));
        
        // 检查分类下是否有文章
        if (!category.getArticles().isEmpty()) {
            throw new RuntimeException("该分类下还有文章，无法删除");
        }
        
        categoryRepository.deleteById(id);
    }
    
    /**
     * 启用/禁用分类
     */
    public void toggleCategoryStatus(Long id) {
        Category category = categoryRepository.findById(id)
                .orElseThrow(() -> new RuntimeException("分类不存在"));
        
        category.setEnabled(!category.getEnabled());
        categoryRepository.save(category);
    }
    
    /**
     * 更新分类排序
     */
    public void updateSortOrder(Long id, Integer sortOrder) {
        Category category = categoryRepository.findById(id)
                .orElseThrow(() -> new RuntimeException("分类不存在"));
        
        category.setSortOrder(sortOrder);
        categoryRepository.save(category);
    }
    
    /**
     * 检查分类名称是否存在
     */
    public boolean existsByName(String name) {
        return categoryRepository.existsByName(name);
    }
    
    /**
     * 获取所有分类（包括禁用的）
     */
    public List<Category> getAllCategories() {
        return categoryRepository.findAll();
    }
    
    /**
     * 根据ID获取分类
     */
    public Category getCategoryById(Long id) {
        return categoryRepository.findById(id)
                .orElseThrow(() -> new RuntimeException("分类不存在"));
    }
}